﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Grafos;

namespace GrafosTestUnit {
    /// <summary>
    /// Testes na classe Aresta
    /// </summary>
    [TestClass]
    public class TesteAresta {

        /// <summary>
        /// Verifica se ÉLoop identifica loops corretamente
        /// </summary>
        /// <remarks>
        /// Processo:
        /// Cria dois vértices v1, v2
        /// Cria duas arestas (v1, v1) e (v1, v2)
        /// Verifica que a primeira aresta é loop, mas a segunda não é loop
        /// </remarks>
        [TestMethod]
        public void Loops() {
            Vértice v1, v2;
            Aresta a1, a2;
            
            v1 = new Vértice("A1");
            v2 = new Vértice("A2");
            a1 = new Aresta(v1, v1);
            a2 = new Aresta(v1, v2);

            Assert.IsTrue(a1.ÉLoop);
            Assert.IsFalse(a2.ÉLoop);
        }

        /// <summary>
        /// Verifica se a identificação de arestas paralelas através do método ÉParalela está correta
        /// </summary>
        /// <remarks>
        /// Processo:
        /// Cria dois vértice v1, v2
        /// Cria três arestas A1 = (v1, v2), A2 = (v1, v1), A3 = (v1, v2)
        /// Verifica que:
        /// A1 é paralela a A3
        /// A3 é paralela a A1
        /// A1 não é paralela a A2
        /// A2 não é paralela a A1
        /// A3 não é paralela a A2
        /// A2 não é paralela a A3
        /// A1 é paralela a A1
        /// A2 é paralela a A2
        /// A3 é paralela a A3
        /// </remarks>
        [TestMethod]
        public void Paralelas() {
            Vértice v3, v4;
            Aresta a1, a2, a3;

            v3 = new Vértice("A3");
            v4 = new Vértice("A4");

            a1 = new Aresta(v3, v4);
            a2 = new Aresta(v3, v3);
            a3 = new Aresta(v3, v4);

            Assert.IsTrue(a1.ÉParalela(a3));
            Assert.IsTrue(a3.ÉParalela(a1));

            Assert.IsFalse(a1.ÉParalela(a2));
            Assert.IsFalse(a3.ÉParalela(a2));
            Assert.IsFalse(a2.ÉParalela(a1));
            Assert.IsFalse(a2.ÉParalela(a3));

            // reflexividade
            Assert.IsTrue(a1.ÉParalela(a1));
            Assert.IsTrue(a2.ÉParalela(a2));
            Assert.IsTrue(a3.ÉParalela(a3));
        }
    }
}
